package com.bwie.common.handler;

import com.bwie.common.exceptions.BusinessException;
import com.bwie.common.result.Result;
import lombok.extern.log4j.Log4j2;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * @ClassName:
 * @Description: 全局异常处理器
 * @Author: bl
 * @Date: 2025/2/24
 */
@RestControllerAdvice
@Log4j2
public class GlobalExceptionHandler {

    /**
     * 义务异常处理器
     */
    @ExceptionHandler(BusinessException.class)
    public Result<String> businessExceptionHandler(BusinessException bizException) {
        log.error("业务异常，异常信息：{}", bizException.getMessage());
        return Result.error(bizException.getMessage());
    }

    /**
     * 参数不合法异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<String> businessExceptionHandler(MethodArgumentNotValidException mane) {
        // 从异常对象中获取绑定结果，绑定结果包含了参数验证的详细信息
        BindingResult bindingResult = mane.getBindingResult();
        // 从绑定结果中获取所有错误列表
        List<ObjectError> errors = bindingResult.getAllErrors();
        // 创建一个 StringBuilder 对象，用于拼接所有的错误信息
        StringBuilder stringBuilder = new StringBuilder();
        // 遍历所有错误列表
        for (ObjectError error : errors) {
            // 将每个错误的默认错误消息追加到 StringBuilder 中
            stringBuilder.append(error.getDefaultMessage() + ";");
        }
        // 使用日志记录器记录错误信息，方便后续排查问题
        log.error("参数不合法异常，异常信息：{}", stringBuilder.toString());
        // 创建一个包含错误信息的结果对象并返回给客户端，告知客户端参数验证不通过的具体原因，如：验证码不能为空！;手机号格式不正确！;
        return Result.error(stringBuilder.toString());
    }

}
